package initialize

import (
	"fmt"
	"go.uber.org/zap"
	"log"
	"os"
	"time"
	"user_srv/global"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"

	"user_srv/model"
)

func InitDB() {

	// Mysql配置信息
	mysqlInfo, errs := global.GetMysqlFromConsul(global.MyConfigClient, "mysql")
	if errs != nil {
		zap.S().Info("获取Mysql配置信息失败", errs)
	}
	zap.S().Info("Mysql配置信息:", mysqlInfo)

	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		mysqlInfo.User, mysqlInfo.Pwd, mysqlInfo.Host, mysqlInfo.Port, mysqlInfo.Database)
	zap.S().Info("Mysql链接信息:", dsn)

	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
		logger.Config{
			SlowThreshold: time.Second,   // 慢 SQL 阈值
			LogLevel:      logger.Silent, // Log level
			Colorful:      true,          // 禁用彩色打印
		},
	)

	// 全局模式
	var err error
	global.DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true,
		},
		Logger: newLogger,
	})
	if err != nil {
		panic(err)
	}

	//校验数据库数否存在表，不存在创建 后台角色表
	if !global.DB.Migrator().HasTable("admin_menu_auth") {
		global.DB.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=测试")
		if err = global.DB.Migrator().CreateTable(&model.MenuAuth{}); err != nil {
			panic(err)
		}
	}
	//校验数据库数否存在表，不存在创建 后台角色表
	if !global.DB.Migrator().HasTable("admin_role") {
		global.DB.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='后台角色表'")
		if err = global.DB.Migrator().CreateTable(&model.Role{}); err != nil {
			panic(err)
		}
	}
	//校验数据库数否存在表，不存在创建 后台角色权限关联表
	if !global.DB.Migrator().HasTable("admin_role_user_auth") {
		global.DB.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='后台角色关联权限表'")
		if err = global.DB.Migrator().CreateTable(&model.RoleUserAuth{}); err != nil {
			panic(err)
		}
	}
	//校验数据库数否存在表，不存在创建 后台用户表
	if !global.DB.Migrator().HasTable("admin_users") {
		global.DB.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='后台用户表'")
		if err = global.DB.Migrator().CreateTable(&model.User{}); err != nil {
			panic(err)
		}
	}
	//global.DB.AutoMigrate(&model.User{}, &model.Department{})
}
